import { get, post, del } from './request'

// 发文查询参数 DTO
export interface DocumentQueryParams {
  documentNumber?: string
  title?: string
  applicantId?: number
  applicantName?: string
  documentType?: string
  urgencyLevel?: string
  securityLevel?: string
  status?: string
  companyId?: number
  applicantDeptId?: number
  state?: number // 0-已完结 1-进行中
  isDistributed?: number // 0-未分发 1-已分发
  current?: number // 当前页
  size?: number // 每页大小
  pageNum?: number
  pageSize?: number
}

// 发文记录类型
export interface DocumentItem {
  id: number
  documentNumber?: string
  title: string
  bizCategory?: string
  urgencyLevel?: string
  securityLevel?: string
  status?: string
  currentStep?: number
  currentStepName?: string
  nextStepName?: string
  applicantId?: number
  applicantName?: string
  applicantDeptName?: string
  isDistributed?: number // 0-未分发 1-已分发
  redHeaderFilePath?: string
  sealFilePath?: string
  createdAt?: string
  updatedAt?: string
  completedAt?: string
  issueNumberApproval?: number // 是否需要主要领导审批 0-否 1-是
}

/**
 * 获取我的发文列表（根据申请人ID查询）
 * @param params 查询参数
 * @returns Promise 返回发文列表
 */
export function getMyDocuments(params: DocumentQueryParams) {
  return post<{
    records: DocumentItem[]
    total: number
    current: number
    size: number
  }>('/document/pageall', params)
}

/**
 * 获取所有发文列表
 * @param params 查询参数（包含applicantId时查询指定用户，不传时查询所有）
 * @returns Promise 返回所有发文列表
 */
export function getAllDocumentsall(params: DocumentQueryParams) {
  return post<{
    records: DocumentItem[]
    total: number
    current: number
    size: number
  }>('/document/pageall', params)
}

/**
 * 获取发文详情
 * @param id 发文ID
 * @returns Promise 返回发文详情
 */
export function getDocumentDetail(id: number) {
  return get<DocumentItem>(`/document/${id}`)
}

/**
 * 删除发文（草稿）
 * @param id 发文ID
 * @returns Promise 返回删除结果
 */
export function deleteDocument(id: number) {
  return del(`/document/${id}`)
}

/**
 * 获取发文分发记录（内部部门）
 * @param sourceDocumentId 源发文ID
 * @returns Promise 返回内部分发记录
 */
export function getInternalDocumentDistributions(sourceDocumentId: number) {
  return get(`/receive/document-receive/list-by-source/${sourceDocumentId}`)
}

/**
 * 获取当前用户待审批的公文列表
 * @param current 当前页
 * @param size 每页大小
 * @param documentTitle 公文标题（可选）
 * @returns Promise 返回待审批公文列表
 */
export function getCurrentUserPendingDocuments(
  current: number,
  size: number,
  documentTitle?: string,
) {
  return get('/document/approval/pending', {
    pageNum: current,
    pageSize: size,
    title: documentTitle,
  })
}

/**
 * 获取当前用户已审批完成的公文列表（审批记录）
 * @param params 查询参数
 * @returns Promise 返回已审批公文列表
 */
export function getApprovalDocumentRecords(params: DocumentQueryParams) {
  return get('/document/flow-progress/approved-documents/page', params)
}

/**
 * 提交公文审批
 * @param documentId 公文ID
 * @param approvalData 审批数据
 * @returns Promise 返回审批结果
 */
export function submitDocumentApproval(documentId: number, approvalData: any) {
  // 使用正确的审批接口路径（与网页端一致）
  return post(`/document/approval/submit/${documentId}`, approvalData)
}

/**
 * 获取当前步骤可选审批人员
 * @param documentId 公文ID
 * @param stepOrder 步骤顺序
 * @returns Promise 返回审批人员列表
 */
export function getApproversByStep(documentId: number, stepOrder: number) {
  return get('/document/approvers/by-step', {
    documentId: documentId,
    currentStep: stepOrder,
  })
}

/**
 * 提交公文审批（携带审批人员）
 * @param documentId 公文ID
 * @param submitData 提交数据（包含审批人员）
 * @returns Promise 返回提交结果
 */
export function submitDocumentWithApprovers(documentId: number, submitData: any) {
  return post(`/document/${documentId}/submit-with-approvers`, submitData)
}

/**
 * 获取当前用户待套红的公文列表
 * @returns Promise 返回待套红公文列表
 */
export function getCurrentRedHeaderDocuments() {
  return get('/document/red-header/list/current')
}

/**
 * 应用套红
 * @param documentId 公文ID
 * @param redHeaderFilePath 红头文件路径
 * @param bizCategory 业务类别
 * @returns Promise 返回套红结果
 */
export function applyRedHeader(documentId: number, redHeaderFilePath: string, bizCategory: string) {
  // 后端使用 @RequestParam，参数需要作为URL查询参数传递
  // 手动构建查询字符串（兼容所有环境）
  const queryParams: string[] = []
  queryParams.push(`redHeaderFilePath=${encodeURIComponent(redHeaderFilePath)}`)
  if (bizCategory) {
    queryParams.push(`bizCategory=${encodeURIComponent(bizCategory)}`)
  }
  return post(`/document/${documentId}/red-header?${queryParams.join('&')}`)
}

/**
 * 获取编辑套红链接
 * @param documentId 公文ID
 * @param mode 模式（VIEW/EDIT）
 * @returns Promise 返回编辑链接
 */
export function getEditAddRedLink(documentId: number, mode: string) {
  return get(`/document/${documentId}/edit-red-link`, { mode })
}

/**
 * 获取当前用户待签章的公文列表
 * @returns Promise 返回待签章公文列表
 */
export function getCurrentSealDocuments() {
  return get('/document/seal/list/current')
}

/**
 * 应用签章
 * @param documentId 公文ID
 * @param sealId 印章ID
 * @param sealInfo 签章信息（意见）
 * @returns Promise 返回签章结果
 */
export function applySeal(documentId: number, sealId: number, sealInfo: string) {
  // 后端使用 @RequestParam，参数需要作为URL查询参数传递
  // 手动构建查询字符串（兼容所有环境）
  const queryParams: string[] = []
  queryParams.push(`sealInfo=${encodeURIComponent(sealInfo)}`)
  queryParams.push(`sealId=${encodeURIComponent(String(sealId))}`)
  return post(`/document/${documentId}/seal?${queryParams.join('&')}`)
}

// ==================== 印章管理相关接口 ====================

/**
 * 印章信息类型
 */
export interface SealInfo {
  id: number // 印章ID
  sealName: string // 印章名称
  sealType: number // 印章类型：1-专用章 0-常规章
  sealBase64?: string // 印章图片Base64（带水印）
  sealUrl?: string // 兼容旧字段（已废弃，使用 sealBase64）
  status: number // 状态：1-启用 0-禁用
  companyId: number // 所属单位ID
  companyName?: string // 所属单位名称
  hasPassword?: boolean // 是否有密码
}

/**
 * 获取可用印章列表（用于签章时选择）
 * @returns Promise 返回印章列表
 */
export function getSealList() {
  return get('/document/seal/list')
}

/**
 * 检查公章是否有密码
 * @param sealId 公章ID
 * @returns Promise 返回是否有密码
 */
export function checkSealHasPassword(sealId: number) {
  return get(`/document/seal/hasPassword?sealId=${sealId}`)
}

/**
 * 验证公章密码
 * @param sealId 公章ID
 * @param password 密码
 * @returns Promise 返回验证结果
 */
export function verifySealPassword(sealId: number, password: string) {
  return post('/document/seal/verifyPassword', {
    sealId,
    password,
  })
}

/**
 * 设置公章密码
 * @param sealId 公章ID
 * @param password 新密码
 * @param confirmPassword 确认密码
 * @returns Promise 返回设置结果
 */
export function setSealPassword(sealId: number, password: string, confirmPassword: string) {
  return post('/document/seal/setPassword', {
    sealId,
    password,
    confirmPassword,
  })
}

/**
 * 获取仪表板统计数据
 * @returns Promise 返回统计数据
 */
export function getDashboardStatistics() {
  return get('/system/dashboard/statistics')
}

/**
 * 获取我的待办事项列表（首页）
 * @param limit 限制数量
 * @returns Promise 返回待办事项列表
 */
export function getMyTodoList(limit: number = 10) {
  // 复用待审批接口，获取前N条待办事项
  return getCurrentUserPendingDocuments(1, limit, undefined)
}

/**
 * 获取公文审批流程记录
 * @param documentId 公文ID
 * @returns Promise 返回审批流程记录
 */
export function getApprovalFlowRecords(documentId: number) {
  return post(`/document/approval/page/getallFlowList`, {
    documentID: documentId,
  })
}

/**
 * 分管领导直接跳到套红（特殊审批流程）
 * @param documentId 公文ID
 * @param approvalData 审批数据
 * @returns Promise 返回审批结果
 */
export function jumpAddRedStamp(documentId: number, approvalData: any) {
  return post(`/document/${documentId}/updown-with-approvers`, approvalData)
}

// ==================== 收文审批相关接口 ====================

/**
 * 查询当前步骤的审批类型
 * @param bizId 收文业务ID
 * @param stepOrder 步骤序号
 * @returns Promise 返回审批类型 { approvalType: 'single' | 'multiple' }
 */
export function getCurrentStepApprovalType(bizId: number, stepOrder: number) {
  return get('/receive/flow-progress/document/approval-type', { bizId, stepOrder })
}

/**
 * 获取收文审批流程步骤和审批人员
 * @param documentId 收文ID
 * @param stepOrder 步骤序号
 * @returns Promise 返回流程进度和审批人员列表
 */
export function getReceiveDocumentFlowByStep(documentId: number, stepOrder: number) {
  return get(`/receive/flow-progress/document/${documentId}/step/${stepOrder}`)
}

/**
 * 提交收文审批（选择审批人员）
 * @param payload 审批数据
 * @returns Promise 返回审批结果
 */
export function submitApprovers(payload: {
  bizId: number
  approvers: { id: number; name: string }[]
  opinion?: string
  decision?: string
  receiveStepName?: string
  receiveStepOrder?: number
}) {
  return post('/receive/flow-progress/document/submit-approvers', payload)
}

/**
 * 归档收文
 * @param bizId 收文业务ID
 * @param data 归档数据
 * @returns Promise 返回归档结果
 */
export function archiveReceiveDocument(
  bizId: number,
  data: { approvalDeadline: string; opinion: string },
) {
  return post(`/receive/distributes/${bizId}/archive`, data)
}

/**
 * 获取收文详情
 * @param id 收文ID
 * @returns Promise 返回收文详情
 */
export function getReceiveRegisterById(id: number) {
  return get(`/receive/distributes/${id}`)
}

/**
 * 获取我的待处理收文列表（按角色）
 * @returns Promise 返回待处理收文列表
 */
export function getMyDistributesByRole() {
  return get('/receive/distributes/mine')
}

/**
 * 获取收文附件列表
 * @param bizId 收文业务ID
 * @returns Promise 返回附件列表
 */
export function getReceiveAttachmentList(bizId: number) {
  return get(`/receive/attachments/${bizId}`)
}

// ==================== 公文分发相关接口 ====================

/**
 * 公文分发请求参数
 */
export interface DocumentDistributePayload {
  documentId: number // 公文ID
  documentTitle: string // 公文标题
  distributeType?: 'external' | 'internal' // 分发类型：external-外部单位，internal-内部部门
  targetCompanyIds?: number[] // 外部单位ID数组
  targetDepartments?: Array<{
    // 内部部门数组
    deptId: number
    deptName: string
    leaderId: number
    leaderName: string
  }>
}

/**
 * 确认分发公文（写入查看表并调用下级单位分发接口）
 * @param payload 分发参数
 * @returns Promise 返回分发结果
 */
export function distributeDocument(payload: DocumentDistributePayload) {
  return post('/document/views/distribute', payload)
}

/**
 * 根据公文ID获取分发记录
 * @param documentId 公文ID
 * @returns Promise 返回分发记录
 */
export function getDocumentDistributions(documentId: number) {
  return get(`/document/views/by-document/${documentId}`)
}

// ==================== 附件管理相关接口 ====================

/**
 * 附件信息类型
 */
export interface AttachmentInfo {
  id: number // 附件ID
  documentId: number // 公文ID
  fileName: string // 文件名
  filePath: string // 文件路径（HTTP URL）
  fileSize: number // 文件大小（字节）
  fileType: string // 文件类型
  fileExtension?: string // 文件扩展名
  uploadUserId: number // 上传用户ID
  uploadUserName?: string // 上传用户名
  uploadTime?: string // 上传时间
  createdAt?: string // 创建时间
}

/**
 * 获取公文附件列表
 * @param documentId 公文ID
 * @returns Promise 返回附件列表
 */
export function getDocumentAttachments(documentId: number) {
  return get<AttachmentInfo[]>(`/attachments/document/${documentId}`)
}

/**
 * 下载附件（返回base64格式）
 * @param attachmentId 附件ID
 * @returns Promise 返回附件数据（包含base64）
 */
export function downloadAttachment(attachmentId: number) {
  return get(`/attachments/download/${attachmentId}`)
}

// ==================== 推送设备管理相关接口 ====================

/**
 * 设备信息类型
 */
export interface DeviceInfo {
  clientId: string // UniPush ClientID
  platform: string // ios/android
  deviceModel?: string // 设备型号
  systemVersion?: string // 系统版本
  appVersion?: string // App版本
}

/**
 * 注册推送设备
 * @param deviceInfo 设备信息
 * @returns Promise 返回注册结果
 */
export function registerPushDevice(deviceInfo: DeviceInfo) {
  return post('/push/device/register', deviceInfo)
}

/**
 * 更新设备活跃时间
 * @param clientId 设备ClientID
 * @returns Promise 返回更新结果
 */
export function updateDeviceActiveTime(clientId: string) {
  return post('/push/device/heartbeat', { clientId })
}

/**
 * 预览附件（返回base64格式）
 * @param attachmentId 附件ID
 * @returns Promise 返回附件数据（包含base64）
 */
export function previewAttachment(attachmentId: number) {
  return get(`/attachments/preview/${attachmentId}`)
}
